01. 概述

实战项目概述

现在,你需要一展所学,来解决 Andy 的这个直方图滤波器问题。在他的代码里,你会找到 8 个 C++ 文件。其中有 6 个包括直方图滤波器函数。其他 2 个中,一个是 main.cpp 文件,一个包含打印矩阵的一个函数。

你需要通读他的文件,运行程序,并提升他的代码的运行速度。

本项目不评分 ,我们会在“代码参考”部分提供参考答案。本项目没有严格的对错之分。我们的目标是让代码运行速度更快。代码参考展示了几种可行的优化方式。

项目文件

在本课的下一部分,你会发现一个嵌入式工作空间,它包含了以下文件和文件夹:

  • andy_histogram_filter 文件夹
  • optimized_code 文件夹
  • instructions.md 文件
andy_histogram_filter

andy_histogram_filter 文件夹包括了 Andy 的直方图滤波器代码。其中有一个 main.cpp 文件,会运行每个直方图滤波器函数并计时。计时结果会输出至终端。

其他的 .cpp 文件含有直方图滤波器的函数定义。

optimized_code

optimized_code 同样也包括了一份 Andy 的直方图滤波器代码。你需要在这里调整并优化代码。这些文件带有注释,可以为你的优化提供灵感。

instructions.md

本文件包括完成并运行本项目的进一步说明。

hints.md

optimized_code 中的文件已经提示了如何优化。hints 文件中的提示更明确,但没有给出实际代码。你无需阅读本文件。我们建议你在阅读 hints 文件前,先自行尝试优化代码。

代码说明

以下为直方图滤波器代码工作原理的说明。

在 main.cpp 中,你会发现一个名为 grid 的向量。grid 是一个字符向量,它包括了一个二维正方形网格中的颜色值。

initialize_beliefs 函数代入 grid 字符,并为玩各种的每个正方形输出初始概率。

然后, sense 函数测量当前网格空间的颜色。测量值用于更新网格中每个空间的概率。

接下来, blur 函数使用平滑算法通过网格。

然后,概率通过 normalize 函数实现归一化。

最后,机器人移动到平面上的新位置,概率相应更新。

每个函数运行一万次。你可以在迭代变量中更改次数值。

顺序

我们建议按以下顺序完成本项目:

  1. 通读 instructions.md 中的指示
  2. 运行 andy_histogram_filter 文件夹中的代码(运行方式参见 instructions.md)
  3. 打开 main.cpp 并通读代码。本文件内容无需更改。注意,所有函数的运行次数相同。每个函数都使用时钟打包 (wrap)。
  4. 通读所有 .cpp 文件,熟悉代码。
  5. 优化 optimized_code 文件夹中的代码。每次优化时,都要运行代码,确认速度的确有提升。

下面是建议的文件优化顺序:

  • zeros.cpp
  • initialize_beliefs.cpp
  • sense.cpp
  • blur.cpp
  • normalize.cpp
  • move.cpp